home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 / Aminet - June 1993 [Walnut Creek].iso / usenet / sources / volume90 / devices / env2manx.0
Encoding:
Text File  |  1990-01-29  |  36.7 KB  |  1,511 lines

  1. Path: xanth!cs.odu.edu!Amiga-Request
  2. From: Amiga-Request@cs.odu.edu (Amiga Sources/Binaries Moderator)
  3. Newsgroups: comp.sources.amiga
  4. Subject: v90i033: env2manx 1.0 - ENV: that's compatible with Manx environment variables, Part01/01
  5. Message-ID: <11143@xanth.cs.odu.edu>
  6. Date: 29 Jan 90 00:07:54 GMT
  7. Sender: tadguy@cs.odu.edu
  8. Reply-To: ludde@nada.kth.se (Erik Lundevall)
  9. Lines: 1498
  10. Approved: tadguy@cs.odu.edu (Tad Guy)
  11. X-Mail-Submissions-To: Amiga@cs.odu.edu
  12.  
  13. Submitted-by: ludde@nada.kth.se (Erik Lundevall)
  14. Posting-number: Volume 90, Issue 033
  15. Archive-name: devices/env2manx-1.0
  16.  
  17. This program makes Commorore`s WB1.3 Env: environment variables
  18. compatible with MANX/Tomas Rokicki's.
  19.  
  20. #!/bin/sh
  21. # This is a shell archive.  Remove anything before this line, then unpack
  22. # it by saving it into a file and typing "sh file".  To overwrite existing
  23. # files, type "sh file -c".  You can also feed this as standard input via
  24. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  25. # will see the following message at the end:
  26. #        "End of archive 1 (of 1)."
  27. # Contents:  env-handler.c env-handler.h env.doc funcs.c funcs.h
  28. #   globals.h makefile mountlist
  29. # Wrapped by tadguy@xanth on Sun Jan 28 19:07:43 1990
  30. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  31. if test -f 'env-handler.c' -a "${1}" != "-c" ; then 
  32.   echo shar: Will not clobber existing file \"'env-handler.c'\"
  33. else
  34. echo shar: Extracting \"'env-handler.c'\" \(5080 characters\)
  35. sed "s/^X//" >'env-handler.c' <<'END_OF_FILE'
  36. X/*
  37. X *  FILE
  38. X *    env-handler.c
  39. X *
  40. X *  VERSION
  41. X *    V1.0
  42. X *
  43. X *  DESCRIPTION
  44. X *    This program makes the env: environment variables compatible
  45. X *    with the old MANX variables. (They said it couldn`t be done...)
  46. X *
  47. X *  AUTHOR
  48. X *    Anders `ALi' Lindgren
  49. X *    Malarblick 8
  50. X *    S-161 51 Bromma
  51. X *    Sweden
  52. X *
  53. X *  STATUS
  54. X *    This program is in the Public Domain.
  55. X *
  56. X *  CODE HISTORY
  57. X *    26-Sep-89   (07:50) Created the File.
  58. X *    26-Sep-89   (10:30) File basically completed. :-)
  59. X */
  60. X
  61. X#include "env-handler.h"
  62. X
  63. X
  64. X
  65. X/* Oh No, a global variable! */
  66. X
  67. Xstruct ArpBase * ArpBase;
  68. X
  69. X/*
  70. X *  FUNCTION
  71. X *    env_handler
  72. X *
  73. X *  DESCRIPTION
  74. X *    This function initializes all.
  75. X *
  76. X *  NOTE
  77. X *    Though this is the first function, I have not named it main().
  78. X *    I can now see if there is any mistakes made at link time (ie. no
  79. X *    startupcode shall be used.)
  80. X */
  81. X
  82. Xstatic void __saveds
  83. Xenv_handler( void )
  84. X{
  85. X    register struct DosPacket     * pkt;     /* The actual packet    */
  86. X    register struct MsgPort     * port;    /* Process msg port    */
  87. X         struct Process     * proc;    /* My process        */
  88. X         struct Message     * msg;     /* Messages from port    */
  89. X         struct DosList     * node;    /* My devicenode    */
  90. X         char           name[4];    /* Temporary name buffer */
  91. X         int           len;
  92. X         char           * ident;    /* program identification */
  93. X
  94. X    /*
  95. X     * The following line simply embedds the text into the executable
  96. X     * file, so the name of the project and the versionnumber
  97. X     * can be seen.
  98. X     */
  99. X
  100. X
  101. X    ident =     "\0*** ENV2MANX Env-Handler V1.0, 1990-01-20,"
  102. X        "Written by Anders Lindgren ***";
  103. X
  104. X
  105. X    proc = (struct Process *)FindTask(NULL);
  106. X
  107. X    WaitPort( port = & proc->pr_MsgPort );
  108. X    msg = GetMsg(port);
  109. X    pkt = (struct DosPacket *) msg->mn_Node.ln_Name;
  110. X
  111. X
  112. X    if ( ArpBase = (struct ArpBase *)OpenLibrary(ArpName, ArpVersion) ) {
  113. X
  114. X    node = (struct DosList *) BTOC( pkt->dp_Arg3 );
  115. X
  116. X    len = BtoCStr( & name[0] , node->dol_Name , 3);
  117. X    if ( (Strncmp(name, "env", 3) == 0) && (len == 3) ) {
  118. X
  119. X        /* Inform AD that we are here by complement the dosnode */
  120. X        node->dol_Task  = port;
  121. X
  122. X        pkt->dp_Res1    = DOS_TRUE;
  123. X        pkt->dp_Res2    = 0;
  124. X
  125. X        ReplyPkt(pkt, port);
  126. X
  127. X        main_lupe(port, node);
  128. X
  129. X        node->dol_Task = NULL;
  130. X    }
  131. X    else {
  132. X            /* Started under other name than env: */
  133. X        pkt->dp_Res1 = DOS_FALSE;
  134. X        pkt->dp_Res2 = ERROR_BAD_STREAM_NAME;
  135. X        ReplyPkt(pkt, port);
  136. X    }
  137. X    CloseLibrary((struct Library *)ArpBase);
  138. X    }
  139. X    else {    /* Arp did`t open */
  140. X    pkt->dp_Res1 = DOS_FALSE;
  141. X    pkt->dp_Res2 = ERROR_OBJECT_NOT_FOUND;
  142. X    ReplyPkt(pkt, port);
  143. X    }
  144. X
  145. X    return;
  146. X}
  147. X
  148. X
  149. X/*
  150. X *  FUNCTION
  151. X *    main_lupe
  152. X *
  153. X *  DESCRIPTION
  154. X *    This is the `waitloop' of the handler. It get`s the massage,
  155. X *    interpreted it, executes the right functions and exits.
  156. X */
  157. X
  158. Xstatic void
  159. Xmain_lupe(register struct MsgPort * port, register struct DosList * node)
  160. X{
  161. X    register struct DosPacket * pkt;
  162. X    register struct Message   * msg;
  163. X         BOOL        quit;
  164. X
  165. X    quit = FALSE;
  166. X
  167. X    while (!quit) {
  168. X
  169. X    WaitPort (port);
  170. X    while (msg = GetMsg(port)) {
  171. X        pkt = (struct DosPacket *)msg->mn_Node.ln_Name;
  172. X
  173. X        pkt->dp_Res1 = DOS_FALSE;
  174. X        pkt->dp_Res2 = 0;
  175. X
  176. X
  177. X        switch(pkt->dp_Type) {
  178. X
  179. X            /* Exit the handler. Note that no error checking
  180. X             * is made. If you send this packet YOU must first
  181. X             * be sure of that no program is using the handler.
  182. X             *       This packet was ONLY implemented for testing
  183. X             * purpose!
  184. X             */
  185. X        case ACTION_DIE:
  186. X        quit = TRUE;
  187. X        break;
  188. X
  189. X        case ACTION_FINDINPUT:
  190. X        action_input(pkt, port);
  191. X        break;
  192. X
  193. X        case ACTION_FINDOUTPUT:
  194. X        action_output(pkt, port);
  195. X        break;
  196. X
  197. X        case ACTION_END:
  198. X        action_end(pkt);
  199. X        break;
  200. X
  201. X        case ACTION_READ:
  202. X        action_read(pkt);
  203. X        break;
  204. X
  205. X        case ACTION_WRITE:
  206. X        action_write(pkt);
  207. X        break;
  208. X
  209. X        case ACTION_LOCATE_OBJECT:
  210. X        action_lock(pkt, port, node);
  211. X        break;
  212. X
  213. X        case ACTION_COPY_DIR:
  214. X        action_copy_lock(pkt);
  215. X        break;
  216. X
  217. X        case ACTION_FREE_LOCK:
  218. X        action_freelock(pkt);
  219. X        break;
  220. X
  221. X        case ACTION_DELETE_OBJECT:
  222. X        action_delete(pkt);
  223. X        break;
  224. X
  225. X        case ACTION_EXAMINE_OBJECT:
  226. X        action_examine_object(pkt);
  227. X        break;
  228. X
  229. X        case ACTION_EXAMINE_NEXT:
  230. X        action_examine_next(pkt);
  231. X        break;
  232. X
  233. X        /* Fooling the client that we accept the following
  234. X         * action types, so copy etc. won`t make a fuzz.
  235. X         */
  236. X        case ACTION_SET_PROTECT:
  237. X        case ACTION_SET_COMMENT:
  238. X        case ACTION_SET_DATE:
  239. X        pkt->dp_Res1 = DOS_TRUE;
  240. X        break;
  241. X
  242. X
  243. X        default:
  244. X        pkt->dp_Res1 = DOS_FALSE;
  245. X        pkt->dp_Res2 = ERROR_ACTION_NOT_KNOWN;
  246. X        break;
  247. X
  248. X        } /* switch */
  249. X
  250. X        ReplyPkt(pkt, port);
  251. X
  252. X    } /* while */
  253. X    } /* while */
  254. X
  255. X    return;
  256. X
  257. X} /* main_lupe */
  258. X
  259. X
  260. X/*
  261. X *  FUNCTION
  262. X *    ReplyPkt
  263. X *
  264. X *  DESCRIPTION
  265. X *    Replies the Packet back to the client.
  266. X *
  267. X *  NOTE
  268. X *    This function is called even if Arp.Library didn`t open.
  269. X */
  270. X
  271. Xstatic void
  272. XReplyPkt(register struct DosPacket * pkt, register struct MsgPort * port)
  273. X{
  274. X    register struct Message * msg;
  275. X    register struct MsgPort * rport;
  276. X
  277. X    rport = pkt->dp_Port;
  278. X    msg   = pkt->dp_Link;
  279. X    pkt->dp_Port = port;
  280. X    msg->mn_Node.ln_Name = (BYTE *)pkt;
  281. X    msg->mn_Node.ln_Succ = NULL;
  282. X    msg->mn_Node.ln_Pred = NULL;
  283. X
  284. X    PutMsg(rport,msg);
  285. X    return;
  286. X} /* ReplyPkt */
  287. END_OF_FILE
  288. if test 5080 -ne `wc -c <'env-handler.c'`; then
  289.     echo shar: \"'env-handler.c'\" unpacked with wrong size!
  290. fi
  291. # end of 'env-handler.c'
  292. fi
  293. if test -f 'env-handler.h' -a "${1}" != "-c" ; then 
  294.   echo shar: Will not clobber existing file \"'env-handler.h'\"
  295. else
  296. echo shar: Extracting \"'env-handler.h'\" \(832 characters\)
  297. sed "s/^X//" >'env-handler.h' <<'END_OF_FILE'
  298. X/*
  299. X *  FILE
  300. X *    env-handler.h
  301. X *
  302. X *  DESCRIPTION
  303. X *    This file is the headerfile for the env-handler.c file.
  304. X */
  305. X
  306. X    /* Headerfiles */
  307. X#include <exec/types.h>
  308. X#include <exec/nodes.h>
  309. X#include <exec/ports.h>
  310. X#include <exec/memory.h>
  311. X#include <libraries/dos.h>
  312. X#include <libraries/dosextens.h>
  313. X
  314. X#define  ARP_PRIVATE
  315. X#include <libraries/arpbase.h>
  316. X
  317. X#include <proto/exec.h>
  318. X
  319. X#include "globals.h"
  320. X
  321. X
  322. X    /* Definitions */
  323. X#define BTOC(x)    ((void *) ( ((LONG)(x)) << 2 ) )
  324. X#define CTOB(x)    ((BPTR)   ( ((LONG)(x)) >> 2 ) )
  325. X
  326. X#define DOS_FALSE  (0)
  327. X#define DOS_TRUE   (-1)
  328. X
  329. X
  330. X    /* Forward references */
  331. Xextern void __saveds  env_handler     (void);
  332. Xextern void   main_lupe       (register struct MsgPort   *,
  333. X                   register struct DosList     *);
  334. Xextern void   ReplyPkt          (register struct DosPacket *,
  335. X                   register struct MsgPort     *);
  336. END_OF_FILE
  337. if test 832 -ne `wc -c <'env-handler.h'`; then
  338.     echo shar: \"'env-handler.h'\" unpacked with wrong size!
  339. fi
  340. # end of 'env-handler.h'
  341. fi
  342. if test -f 'env.doc' -a "${1}" != "-c" ; then 
  343.   echo shar: Will not clobber existing file \"'env.doc'\"
  344. else
  345. echo shar: Extracting \"'env.doc'\" \(4376 characters\)
  346. sed "s/^X//" >'env.doc' <<'END_OF_FILE'
  347. X
  348. X     *****    **    *  *     *   #####   **    **   **   **    * *    *
  349. X     *    * *   *  *     *  #     #  * *  * *  *  *  * *   *  *  *
  350. X     ***    *  *  *   *   *       ##   *  **  * ****** *  *  *   **
  351. X     *    *   * *    * *        ##     *      * *    * *   * *  *  *
  352. X     *****    *    **     *      #######  *      * *    * *    ** *    *
  353. X
  354. X
  355. X    -------------------------------------------------------------------
  356. X
  357. X                 Written by:
  358. X                Anders `ALi' Lindgren
  359. X
  360. X            This program makes Commorore`s WB1.3 Env:
  361. X              environment variables compatible with
  362. X                 MANX/Tomas Rokickis.
  363. X
  364. X    -------------------------------------------------------------------
  365. X
  366. X
  367. X    When Commore released WB1.3 they included someting many people were
  368. X    waiting for, a official environment variable standard. But there
  369. X    was one big problem, before WB1.3 there existed already one `de
  370. X    facto' standard. This was constructed by MANX and Tomas Rokicki.
  371. X    ENV: and the MANX variables has been, up to now, totally
  372. X    incompatible.
  373. X
  374. X    This ENV: handler is a program which uses the MANX variables as
  375. X    storage area for the ENV: variables. Resulting in total
  376. X    compability. You can now write a variable to ENV:, and then read it
  377. X    by a MANX compatible function, and vice versa.
  378. X
  379. X    As far as I know the ENV: handler works just like the old ENV:,
  380. X    excpet a few small details:
  381. X        - Subdirectories, Protection bits and FileNotes is NOT
  382. X          supported.
  383. X        - The String terminator (character value 0) is considerd
  384. X          end of string. Everything behind it will be stripped off.
  385. X
  386. X
  387. X    Note, that the handler is constructed for short strings. Don`t use
  388. X    it for normal temporary storage!        ~~~~~~~~
  389. X
  390. X
  391. XUSAGE    To use the env-handler, put it in your L: directory (probably the
  392. X    L directory on your bootdisk.) Merge the file `mountlist' together
  393. X    with DEVS:mountlist. Then type `mount ENV:' at the CLI (or Shell)
  394. X    prompt. If you are permanently going to use the handler then insert
  395. X    the line `mount env:' in your s:Startup-Sequence file.
  396. X    (Env-handler demands to have arp.library in your LIBS: directory.
  397. X    If you don`t have it, you can probably get if from the same source
  398. X    as this program. My appologies to anybody not using the
  399. X    arp.library,)
  400. X
  401. X
  402. XCOMPILATION
  403. X    The sourcefiles needed to generate the program is env-handler.c,
  404. X    env-handler.h, funcs.c, funcs.h and globals.h. These files are
  405. X    relatively well commented, so anybody familar with device-handlers
  406. X    shall be able to follow my thougths.
  407. X        To compile the programs use Lattice C V5 (or newer). All
  408. X    compilation rules is in the file `makefile'. Note that I have
  409. X    tried to keep both compilation time and program size down. For
  410. X    example I don`t link with neither lc.lib nor amiga.lib.
  411. X
  412. X
  413. XREFERENCES
  414. X    Books and article references:
  415. X
  416. X      - `The AmigaDOS Manual', 2nd editon. Bantam Books, Commodore-Amiga.
  417. X      - `Device Handlers: How to create an AmigaDOS device driver'.
  418. X        Steve Simpson, UK-Transactor/Amiga. Vol 1, issue 6, p60.
  419. X        (Watch the bugs in Table 1, Arg1 is supposed to be fh->fh_Arg1
  420. X         in ACTION_READ, _WRITE, _CLOSE and _SEEK)
  421. X      - `The Kickstart guide to the Amiga', Ariadne Software Ltd.
  422. X      - `The Packet interface to AmigaDOS, in C' Mattew Dillon.
  423. X        UK-Transactor/Amiga. Vol 1, issue 1, p15.
  424. X      - Several PD/SW device handlers (including PathAss.)
  425. X
  426. X
  427. XAUTHOR    The ENV: handler was written by:
  428. X        Anders `ALi' Lindgren
  429. X        Malarblick 8
  430. X        S-161 51 Bromma
  431. X        Sweden.
  432. X
  433. X        Phone: No thanks! No calls at 3 AM.
  434. X
  435. X    I can be reached on the Swedish Amiga databases:
  436. X        Camelot - 08   - 34 85 23.
  437. X        NT        - 08   - 52 11 45.
  438. X        ARTLine - 0755 - 61 537
  439. X
  440. XSTATUS    The handler, the sourcecode and documentation is placed in the
  441. X    Public Domain and may be used by any private person. The only
  442. X    rule is that you MUST send me a postcard if you`re using it.
  443. X    This program may be included in any commersial products if my
  444. X    WRITTEN permission is granted, and a registred copy of the
  445. X    product is sent to me.
  446. X    Use the product ON YOUR OWN RISK!
  447. X
  448. X    Use also my other programs:
  449. X        - PathAssign. A general path device, assign several
  450. X          directories to one logical device. (ShareWare)
  451. X        - Pwd/Pop. A turbocharged CD command. Stores the old
  452. X          directories on a stack, which can be popped back. (PD)
  453. X        - SetLace. Handles the interlace mode on the workbench
  454. X          screem. (freely distributable)
  455. X        - Colour, a utility to switch between fixed named
  456. X          coloursetups on the workbench screen. (Soon released)
  457. END_OF_FILE
  458. if test 4376 -ne `wc -c <'env.doc'`; then
  459.     echo shar: \"'env.doc'\" unpacked with wrong size!
  460. fi
  461. # end of 'env.doc'
  462. fi
  463. if test -f 'funcs.c' -a "${1}" != "-c" ; then 
  464.   echo shar: Will not clobber existing file \"'funcs.c'\"
  465. else
  466. echo shar: Extracting \"'funcs.c'\" \(16462 characters\)
  467. sed "s/^X//" >'funcs.c' <<'END_OF_FILE'
  468. X/*
  469. X *  FILE
  470. X *    funcs.c
  471. X *
  472. X *  DESCRIPTION
  473. X *    All the functions for actually read and write the MANX
  474. X *    environment variables.
  475. X *
  476. X *  AUHOR
  477. X *    Anders `ALi' Lindgren
  478. X *    Marlarblick 8
  479. X *    S-161 51 Bromma
  480. X *    Sweden
  481. X *
  482. X *  STATUS
  483. X *    This file is in the Public Domain.
  484. X *
  485. X *  CODE HISTORY
  486. X *    26-Sep-89   (10:51) Created this file.
  487. X *    27-Sep-89   (18:56) Read works ok.
  488. X *            (19:27) ReAlloc written.
  489. X *            (12:00) Both Read and Write works ok.
  490. X *    28-Sep-89   (14:00) Locks implemented.
  491. X *
  492. X *     1-Oct-89        No hacking. I was employed by Commodore,
  493. X *       ...            Sweden at the Alvsjo copmuter fair.
  494. X *     6-Oct-89
  495. X *     6-Oct-89        (Gee, today I bougth a 2000 :-) )
  496. X *
  497. X *     6-Oct-89   (23:30) Implemented Directory functions. Some
  498. X *                people wanted it badly.
  499. X *     8-Oct-89   (12:00) Directory functions works ok.
  500. X *
  501. X *       ...            (I got my hands on MicroGNUEmacs 3. It`s GREAT!)
  502. X *
  503. X *    17-Oct-89        I threw out the old directory functions, becauce
  504. X *                they didn`t function the way I liked. 
  505. X *
  506. X *    20-Jan-90        I`m sorry, but I have been up to my neck into
  507. X *                other things so I haven`t been able to work
  508. X *                on the project. Well, now it`s released, enjoy!
  509. X *
  510. X *  DISCUSSION
  511. X *    Change __builtin_memcpy to CopyMem???
  512. X */
  513. X
  514. X#include "funcs.h"
  515. X
  516. X/*
  517. X *  FUNCTION
  518. X *    action_input
  519. X *
  520. X *  DESCRIPTION
  521. X *    Read an MANX variable. This function copies the variable
  522. X *    value to a temporary buffer.
  523. X *
  524. X *    The valuebuf structure conatisn the following fields:
  525. X *        vb_buf - Pointer to the temporary buffer.
  526. X *        vb_pos - Index, pointing to the next char to be read.
  527. X *        vb_end - Size of the Buffer.
  528. X *
  529. X *    When vb_pos and vb_end is equal, all data was been read.
  530. X */
  531. X
  532. Xvoid
  533. Xaction_input (register struct DosPacket * pkt, struct MsgPort * port)
  534. X{
  535. X    register struct FileHandle * fh;
  536. X    register struct valuebuf   * vb;
  537. X    register        char       * var;
  538. X    register        int      len;
  539. X            char     name[NAMESIZE];
  540. X            char       * varname;
  541. X
  542. X    pkt->dp_Res1 = DOS_FALSE;
  543. X
  544. X    fh = (struct FileHandle *)BTOC(pkt->dp_Arg1);
  545. X
  546. X    BtoCStr(name, pkt->dp_Arg3, NAMESIZE-1);
  547. X    varname = BaseName ( name );
  548. X
  549. X    if ( * varname ) {
  550. X
  551. X    Forbid();
  552. X
  553. X    if (var = mygetenv(varname)) {
  554. X
  555. X        if (vb = (struct valuebuf *) AllocMem( sizeof(struct valuebuf),
  556. X                    MEMF_PUBLIC | MEMF_CLEAR ) ) {
  557. X
  558. X        fh->fh_Type  = port;
  559. X        fh->fh_Arg1  = (long) vb;
  560. X
  561. X        len = __builtin_strlen(var);
  562. X
  563. X        if (vb->vb_buf = AllocMem(len, MEMF_PUBLIC | MEMF_CLEAR)) {
  564. X            vb->vb_end = len;
  565. X            vb->vb_pos = 0;
  566. X
  567. X            __builtin_memcpy(vb->vb_buf, var, len);
  568. X
  569. X            vb->vb_flags = ENVF_READ;
  570. X
  571. X            pkt->dp_Res1 = DOS_TRUE;
  572. X        }
  573. X        else {
  574. X            pkt->dp_Res2 = ERROR_NO_FREE_STORE;
  575. X            FreeMem((char *)vb, sizeof(struct valuebuf));
  576. X        }
  577. X        }
  578. X        else {
  579. X        pkt->dp_Res2 = ERROR_NO_FREE_STORE;
  580. X        }
  581. X    }
  582. X    else {
  583. X        pkt->dp_Res2 = ERROR_OBJECT_NOT_FOUND;
  584. X    }
  585. X
  586. X    Permit();
  587. X    }
  588. X    else {
  589. X    pkt->dp_Res2 = ERROR_BAD_STREAM_NAME;
  590. X    }
  591. X
  592. X    return;
  593. X}
  594. X
  595. X
  596. X/*
  597. X *  FUNCTION
  598. X *    action_read
  599. X *
  600. X *  DESCRIPTION
  601. X *    Writes the buffer to the fh.
  602. X */
  603. X
  604. Xvoid
  605. Xaction_read (register struct DosPacket * pkt)
  606. X{
  607. X    register struct valuebuf * vb;
  608. X    register        int        num;
  609. X
  610. X    vb = (struct valuebuf *)pkt->dp_Arg1;
  611. X
  612. X    if (vb->vb_flags & ENVF_READ) {
  613. X
  614. X            /* Already read all? */
  615. X    if (vb->vb_pos == vb->vb_end) {
  616. X        pkt->dp_Res1 = 0;
  617. X    }
  618. X        else {
  619. X        /* Get the smallest, buffer or remaining chars */
  620. X        if ( (vb->vb_end - vb->vb_pos) <= pkt->dp_Arg3 ) {
  621. X            num = vb->vb_end - vb->vb_pos;
  622. X        }
  623. X        else {
  624. X        num = pkt->dp_Arg3;
  625. X        }
  626. X
  627. X        __builtin_memcpy( (void *)pkt->dp_Arg2,
  628. X                (void *)(vb->vb_buf + vb->vb_pos), num );
  629. X
  630. X        vb->vb_pos += num;
  631. X
  632. X        pkt->dp_Res1 = num;
  633. X    }
  634. X    }
  635. X    else {
  636. X    pkt->dp_Res1 = 0;
  637. X    pkt->dp_Res2 = ERROR_OBJECT_WRONG_TYPE;
  638. X    }
  639. X    return;
  640. X}
  641. X
  642. X
  643. X/*
  644. X *  FUNCTION
  645. X *    action_output
  646. X *
  647. X *  DESCRIPTION
  648. X *    Open the env: for writing a variable.
  649. X *    This function allocates memory for the namestring.
  650. X *    It doesn`t allocate memory for the buffer, because if the
  651. X *    vb_buf is zero (ie. no write has been made) the Setenv
  652. X *    function removes the variable.
  653. X */
  654. X
  655. Xvoid
  656. Xaction_output (register struct DosPacket * pkt, struct MsgPort * port)
  657. X{
  658. X    register struct valuebuf   * vb;
  659. X    register        char       * varname;
  660. X    register        int         namelen;
  661. X         struct FileHandle * fh;
  662. X            char     name[NAMESIZE];
  663. X
  664. X    pkt->dp_Res1 = DOS_FALSE;
  665. X
  666. X    if (vb = (struct valuebuf *) AllocMem( sizeof(struct valuebuf),
  667. X                        MEMF_PUBLIC | MEMF_CLEAR ) ) {
  668. X
  669. X    fh = (struct FileHandle *)BTOC(pkt->dp_Arg1);
  670. X
  671. X    BtoCStr(name, pkt->dp_Arg3, NAMESIZE-1);
  672. X    varname = BaseName( name );
  673. X
  674. X    if ( * varname ) {
  675. X        namelen = __builtin_strlen(varname) + 1;
  676. X
  677. X        if (vb->vb_name = DosAllocMem(namelen)) {
  678. X        __builtin_memcpy(vb->vb_name, varname, namelen);
  679. X
  680. X        fh->fh_Type  = port;
  681. X        fh->fh_Arg1  = (long) vb;
  682. X
  683. X        vb->vb_flags = ENVF_WRITE;
  684. X
  685. X        pkt->dp_Res1 = DOS_TRUE;
  686. X        return;             /* Correct exit */
  687. X        }
  688. X                /* Error hancdling code */
  689. X        else {
  690. X        pkt->dp_Res2 = ERROR_NO_FREE_STORE;
  691. X        }
  692. X    }
  693. X    else {
  694. X        pkt->dp_Res2 = ERROR_BAD_STREAM_NAME;
  695. X    }
  696. X    FreeMem((char *)vb, sizeof(struct valuebuf));
  697. X    }
  698. X    else {
  699. X    pkt->dp_Res2 = ERROR_NO_FREE_STORE;
  700. X    }
  701. X    return;    /* Error Exit! */
  702. X}
  703. X
  704. X
  705. X/*
  706. X *  FUNCTION
  707. X *    action_write
  708. X *
  709. X *  DESCRIPTON
  710. X *    Called when a client writes the contents of a environment
  711. X *    variable.
  712. X *    The data is stored at at buffer. If the buffer is smaler
  713. X *    than the data, the buffer is expanded.
  714. X *    BUFSIZE is the amount of extra memory which shall be
  715. X *    allocated at a ReAlloc call.
  716. X *    (If BUFSIZE is zero, a ReAlloc call will be made at
  717. X *    every write.)
  718. X *
  719. X *  NOTE
  720. X *    No errorchecking is made on the ReAlloc function, yet....
  721. X */
  722. X
  723. Xvoid
  724. Xaction_write (register struct DosPacket * pkt)
  725. X{
  726. X    register struct valuebuf    * vb;
  727. X    register char        * newbuf;
  728. X
  729. X    vb = (struct valuebuf *)pkt->dp_Arg1;
  730. X
  731. X    if (vb->vb_flags & ENVF_WRITE) {
  732. X
  733. X    if (vb->vb_pos + pkt->dp_Arg3 + 1 >= vb->vb_end) {
  734. X        newbuf = ReAlloc(vb->vb_buf, vb->vb_end,
  735. X            vb->vb_end + pkt->dp_Arg3 + BUFSTEP, MEMF_CLEAR);
  736. X        if (newbuf == NULL) {
  737. X        FreeMem (vb->vb_buf, vb->vb_end);
  738. X        DosFreeMem (vb->vb_name);
  739. X        FreeMem ((char *)vb, sizeof(struct valuebuf));
  740. X        pkt->dp_Res1 = 0;
  741. X        pkt->dp_Res2 = ERROR_NO_FREE_STORE;
  742. X        return;
  743. X        }
  744. X        vb->vb_buf = newbuf;
  745. X        vb->vb_end += pkt->dp_Arg3 + BUFSTEP;
  746. X    }
  747. X    __builtin_memcpy(vb->vb_buf + vb->vb_pos, (void *)pkt->dp_Arg2,
  748. X                            pkt->dp_Arg3);
  749. X    vb->vb_pos += pkt->dp_Arg3;
  750. X
  751. X    pkt->dp_Res1 = pkt->dp_Arg3;
  752. X    }
  753. X    else {
  754. X    pkt->dp_Res1 = 0;
  755. X    pkt->dp_Res2 = ERROR_OBJECT_WRONG_TYPE;
  756. X    }
  757. X    return;
  758. X}
  759. X
  760. X
  761. X/*
  762. X *  FUNCTION
  763. X *    action_end
  764. X *
  765. X *  DESCRIPTION
  766. X *    This function is executed when someone Close()`s the filehandler.
  767. X *
  768. X *    On read, it simply frees the memory. On Write, the actual
  769. X *    writing takes place here.
  770. X */
  771. X
  772. Xvoid
  773. Xaction_end (register struct DosPacket * pkt)
  774. X{
  775. X    register struct valuebuf * vb;
  776. X
  777. X    pkt->dp_Res1 = DOS_FALSE;
  778. X
  779. X    if (vb = (struct valuebuf *)pkt->dp_Arg1) {
  780. X
  781. X    if (vb->vb_flags & ENVF_READ) {
  782. X        if (vb->vb_buf && vb->vb_end) {
  783. X        FreeMem( (char *)vb->vb_buf, vb->vb_end);
  784. X        FreeMem( (char *)vb, sizeof(struct valuebuf) );
  785. X        }
  786. X        pkt->dp_Res1 = DOS_TRUE;
  787. X    }
  788. X    else if (vb->vb_flags & ENVF_WRITE) {
  789. X        if (vb->vb_name) {
  790. X        Setenv(vb->vb_name, vb->vb_buf);
  791. X        DosFreeMem(vb->vb_name);
  792. X        }
  793. X        if (vb->vb_buf) {
  794. X        FreeMem(vb->vb_buf, vb->vb_end);
  795. X        }
  796. X        FreeMem((char *)vb, sizeof(struct valuebuf));
  797. X
  798. X        pkt->dp_Res1 = DOS_TRUE;
  799. X    }
  800. X    else {    /* Error */
  801. X        pkt->dp_Res2 = ERROR_OBJECT_WRONG_TYPE;
  802. X    }
  803. X    }
  804. X    else {
  805. X    pkt->dp_Res2 = ERROR_OBJECT_WRONG_TYPE;
  806. X    }
  807. X    return;
  808. X}
  809. X
  810. X
  811. X/*
  812. X *  FUNCTION
  813. X *    action_lock
  814. X *
  815. X *  DESCRIPTION
  816. X *    Lock the env: device, or a `file'.  If a file is locked, the filename
  817. X *    is copied to a aread pointed to by lock->fl_Name.
  818. X *
  819. X *  ARGUMENTS
  820. X *    Arg1 : Lock
  821. X *    Arg2 : Name
  822. X *    Arg3 : Mode
  823. X */
  824. X
  825. Xvoid
  826. Xaction_lock (register struct DosPacket * pkt,
  827. X              struct MsgPort   * port,
  828. X              struct DosList   * node)
  829. X{
  830. X    register struct myFileLock  * lock;
  831. X            char      name[NAMESIZE];
  832. X            char    * namebase;
  833. X
  834. X    pkt->dp_Res1 = NULL;
  835. X
  836. X    if (lock = (struct myFileLock *)AllocMem(sizeof(struct myFileLock),
  837. X                        MEMF_PUBLIC | MEMF_CLEAR)) {
  838. X    pkt->dp_Res1 = CTOB(lock);
  839. X
  840. X    lock->fl_Access = pkt->dp_Arg3;
  841. X    lock->fl_Task   = port;
  842. X    lock->fl_Volume = CTOB(node);
  843. X
  844. X    BtoCStr(name, pkt->dp_Arg2, NAMESIZE-1);
  845. X    if (* (namebase = BaseName( name ))) {
  846. X        if ( (lock->fl_Name = getenvname( namebase )) == NULL ) {
  847. X        FreeMem ((char *)lock, sizeof(struct myFileLock));
  848. X        pkt->dp_Res1 = NULL;
  849. X        pkt->dp_Res2 = ERROR_OBJECT_NOT_FOUND;
  850. X        }
  851. X    }
  852. X    }
  853. X    else {
  854. X    pkt->dp_Res2 = ERROR_NO_FREE_STORE;
  855. X    }
  856. X
  857. X    return;
  858. X}
  859. X
  860. X
  861. X/*
  862. X *  FUNCTION
  863. X *    action_copy_lock
  864. X *
  865. X *  DESCRIPTION
  866. X *    Implement the DupLock function.
  867. X */
  868. X
  869. Xvoid
  870. Xaction_copy_lock (register struct DosPacket * pkt)
  871. X{
  872. X    register struct myFileLock    * newlock;
  873. X    register struct myFileLock    * oldlock;
  874. X    register int          namelen;
  875. X
  876. X    pkt->dp_Res1 = NULL;
  877. X
  878. X    if (oldlock = (struct nyFileLock *)BTOC(pkt->dp_Arg1)) {
  879. X
  880. X    if (newlock = (struct myFileLock *)AllocMem(sizeof(struct myFileLock),
  881. X                        MEMF_PUBLIC | MEMF_CLEAR)) {
  882. X        pkt->dp_Res1 = CTOB(newlock);
  883. X
  884. X        newlock->fl_Access = oldlock->fl_Access;
  885. X        newlock->fl_Task   = oldlock->fl_Task;
  886. X        newlock->fl_Volume = oldlock->fl_Volume;
  887. X
  888. X        if (oldlock->fl_Name) {
  889. X        namelen = __builtin_strlen(oldlock->fl_Name);
  890. X        if (newlock->fl_Name = DosAllocMem( namelen + 1 )) {
  891. X            __builtin_memcpy (newlock->fl_Name, oldlock->fl_Name, namelen );
  892. X        }
  893. X        else {
  894. X            pkt->dp_Res1 = NULL;
  895. X            pkt->dp_Res2 = ERROR_NO_FREE_STORE;
  896. X            FreeMem ((char *) newlock, sizeof(struct myFileLock));
  897. X        }
  898. X        }
  899. X    }
  900. X    else {
  901. X        pkt->dp_Res2 = ERROR_NO_FREE_STORE;
  902. X    }
  903. X    }
  904. X
  905. X    return;
  906. X}
  907. X
  908. X
  909. X/*
  910. X *  FUNCTION
  911. X *    action_freelock
  912. X *
  913. X *  DESCRIPTION
  914. X *    Frees the lock.
  915. X */
  916. X
  917. Xvoid
  918. Xaction_freelock(register struct DosPacket * pkt)
  919. X{
  920. X    register struct myFileLock * lock;
  921. X
  922. X    if (lock = BTOC(pkt->dp_Arg1)) {
  923. X    if (lock->fl_Name) {
  924. X        DosFreeMem((char *) lock->fl_Name);
  925. X    }
  926. X    FreeMem((char *)lock, sizeof(struct myFileLock));
  927. X    }
  928. X    pkt->dp_Res1 = DOS_TRUE;
  929. X
  930. X    return;
  931. X}
  932. X
  933. X
  934. X/*
  935. X *  FUNCTION
  936. X *    action_delete
  937. X *
  938. X *  DESCRIPTION
  939. X *    Delete a MANX variable.
  940. X */
  941. X
  942. Xvoid
  943. Xaction_delete(register struct DosPacket * pkt)
  944. X{
  945. X    char   name[NAMESIZE];
  946. X    char * varname;
  947. X
  948. X    BtoCStr(name, pkt->dp_Arg2, NAMESIZE-1);
  949. X    varname = BaseName( name );
  950. X
  951. X    if (* varname) {
  952. X    if (Setenv(varname, NULL)) {
  953. X        pkt->dp_Res1 = DOS_TRUE;
  954. X    }
  955. X    else {
  956. X        /* As close at is can be. */
  957. X        pkt->dp_Res2 = ERROR_OBJECT_NOT_FOUND;
  958. X    }
  959. X    }
  960. X    else {
  961. X    pkt->dp_Res2 = ERROR_BAD_STREAM_NAME;
  962. X    }
  963. X    return;
  964. X}
  965. X
  966. X
  967. X/*
  968. X *  FUNCTION
  969. X *    action_examine_object
  970. X *
  971. X *  DESCRIPTION
  972. X *    This function returns information about either ENV: itself
  973. X *    os a single varable. It fills in the FileInfoBlock with
  974. X *    appropriate values.
  975. X */
  976. X
  977. Xvoid
  978. Xaction_examine_object(register struct DosPacket * pkt)
  979. X{
  980. X    register struct myFileLock      * lock;
  981. X    register struct FileInfoBlock * fib;
  982. X
  983. X    if (lock = (struct myFileLock *) BTOC(pkt->dp_Arg1)) {
  984. X    if (fib = (struct FileInfoBlock *)BTOC(pkt->dp_Arg2)) {
  985. X
  986. X        if (lock->fl_Name == NULL) {
  987. X
  988. X        fib->fib_DiskKey    = FIRST_KEY;
  989. X        fib->fib_DirEntryType   = 2;          /* Directory  */
  990. X        fib->fib_EntryType    = 2;
  991. X        fib->fib_Size        = 0;
  992. X        fib->fib_NumBlocks    = 0;
  993. X
  994. X        CtoBStr( "ENV", CTOB(fib->fib_FileName), 4);
  995. X        }
  996. X        else {
  997. X        fib->fib_DiskKey    = FIRST_KEY;
  998. X        fib->fib_DirEntryType    = -3;
  999. X        fib->fib_EntryType    = -3;
  1000. X        Forbid();
  1001. X        fib->fib_Size        =
  1002. X                __builtin_strlen(mygetenv(lock->fl_Name));
  1003. X        Permit();
  1004. X        fib->fib_NumBlocks    = 1;
  1005. X
  1006. X        CtoBStr ( lock->fl_Name, CTOB(fib->fib_FileName), 30);
  1007. X        }
  1008. X
  1009. X        fib->fib_Protection     = 0x00;          /* ----rwed   */
  1010. X        fib->fib_Comment[0]     = 0;
  1011. X        /* DateStamp( (long *) & fib->fib_Date );    /* Edit later! */
  1012. X
  1013. X        pkt->dp_Res1 = DOS_TRUE;
  1014. X
  1015. X    }
  1016. X    else {    /* No fib */
  1017. X        pkt->dp_Res2 = ERROR_OBJECT_WRONG_TYPE;
  1018. X    }
  1019. X    }
  1020. X    else {  /* No lock */
  1021. X    pkt->dp_Res2 = ERROR_INVALID_LOCK;
  1022. X    }
  1023. X    return;
  1024. X}
  1025. X
  1026. X
  1027. X/*
  1028. X *  FUNCTION
  1029. X *    action_examine_next
  1030. X *
  1031. X *  DESCTIPTION
  1032. X *    This function:
  1033. X *        - handles the `examine next' packet.
  1034. X *        - is called as part of `examine object' funcetion.
  1035. X *
  1036. X *    It fills in the `FileInfoBlock' with appropriate values.
  1037. X */
  1038. X
  1039. Xvoid
  1040. Xaction_examine_next (register struct DosPacket * pkt)
  1041. X{
  1042. X    register struct myFileLock      * lock;
  1043. X    register struct FileInfoBlock * fib;
  1044. X    register        char      * newname;
  1045. X    register        LONG        namelen;
  1046. X
  1047. X    if (lock = (struct myFileLock *) BTOC(pkt->dp_Arg1)) {
  1048. X    if (fib = (struct FileInfoBlock *)BTOC(pkt->dp_Arg2)) {
  1049. X
  1050. X        Forbid();
  1051. X
  1052. X        if (newname = getnextenv(fib, pkt) ) {
  1053. X        for (namelen = 0; newname[namelen] != '='; namelen++)
  1054. X            ;
  1055. X
  1056. X        fib->fib_DiskKey    += 1;
  1057. X        fib->fib_DirEntryType    = -3;
  1058. X        fib->fib_Protection    = 0x00;        /* ----rwed */
  1059. X        fib->fib_EntryType    = -3;
  1060. X        fib->fib_Size        =
  1061. X                __builtin_strlen(newname) - namelen - 1;
  1062. X        fib->fib_NumBlocks    = 1;        
  1063. X        /* DateStamp( (long *) & fib->fib_Date );  /* Edit later! */
  1064. X        fib->fib_Comment[0]     = 0;
  1065. X
  1066. X        __builtin_memcpy( fib->fib_FileName + 1, newname, namelen);
  1067. X        fib->fib_FileName[0] = namelen;
  1068. X
  1069. X        pkt->dp_Res1 = DOS_TRUE;
  1070. X        }
  1071. X        Permit();
  1072. X    }
  1073. X    else {
  1074. X        pkt->dp_Res2 = ERROR_OBJECT_WRONG_TYPE;
  1075. X    }
  1076. X    }
  1077. X    else {
  1078. X    pkt->dp_Res2 = ERROR_INVALID_LOCK;
  1079. X    }
  1080. X    return;
  1081. X}
  1082. X
  1083. X
  1084. X/*
  1085. X *  FUNCTION
  1086. X *    mygetenv
  1087. X *
  1088. X *  DESCRIPTION
  1089. X *    Get a MANX environment variable.
  1090. X *    I can`t use the Arp function `getenv', because it will call
  1091. X *    ENV: if the variable doesn`t exist in the MANX area, resulting
  1092. X *    in a loop loop loop loop loop.....
  1093. X *
  1094. X *    The EnvSpace is builtup by strings in the form:
  1095. X *         name=value
  1096. X *    They are separated by one \0 and they are ended by two.
  1097. X *
  1098. X *  NOTE
  1099. X *    The task MUST be Forbid()`ed before this function is called!
  1100. X */
  1101. X
  1102. Xstatic char *
  1103. Xmygetenv(register char * name)
  1104. X{
  1105. X    register char * p;
  1106. X    register int    len;
  1107. X
  1108. X    if ( p = ((struct EnvBase*)ArpBase->EnvBase)->EnvSpace ) {
  1109. X
  1110. X    len = __builtin_strlen(name);
  1111. X
  1112. X    while (*p) {
  1113. X        if (Strncmp(p, name, len) == 0) {
  1114. X        if ( p[len] == '=' ) {
  1115. X            return (& p[len+1]);
  1116. X        }
  1117. X        }
  1118. X        p += __builtin_strlen(p) + 1;
  1119. X    }
  1120. X    }
  1121. X    return(NULL);
  1122. X}
  1123. X
  1124. X
  1125. X/*
  1126. X *  FUNCTION
  1127. X *    getnextenv
  1128. X *
  1129. X *  DESCRIPTION
  1130. X *    Get the next environment variable. If an error accured the correct
  1131. X *    errorcode is placed in pkt->dp_Res2 and a NULL is returned.
  1132. X *
  1133. X *  NOTE
  1134. X *    This function MUST be called in Forbid()`ed state.
  1135. X */
  1136. X
  1137. Xstatic char *
  1138. Xgetnextenv (register struct FileInfoBlock * fib, register struct DosPacket * pkt)
  1139. X{
  1140. X    register char * p;
  1141. X    register int    len;
  1142. X
  1143. X    if ( p = ((struct EnvBase*)ArpBase->EnvBase)->EnvSpace ) {
  1144. X
  1145. X    if (fib->fib_DirEntryType > 0) {
  1146. X        if (*p) {
  1147. X        return (p);
  1148. X        }
  1149. X        else {
  1150. X        pkt->dp_Res2 = ERROR_NO_MORE_ENTRIES;
  1151. X        return (NULL);
  1152. X        }
  1153. X    }
  1154. X
  1155. X    while (*p) {
  1156. X        len = __builtin_strlen(p);
  1157. X
  1158. X        if ( (Strncmp(p, fib->fib_FileName + 1,
  1159. X                * fib->fib_FileName) == 0)
  1160. X            && (p[* fib->fib_FileName] == '=') ) {
  1161. X        
  1162. X        if ( * (p + len + 1) ) {
  1163. X            return (p + len + 1);
  1164. X        } 
  1165. X        else {
  1166. X            pkt->dp_Res2 = ERROR_NO_MORE_ENTRIES;
  1167. X            return (NULL);
  1168. X        }
  1169. X        }
  1170. X        p += len + 1;
  1171. X    }
  1172. X    pkt->dp_Res2 = ERROR_OBJECT_NOT_FOUND;    /* Correct??? */
  1173. X    }
  1174. X    return (NULL);    /* No environment at all, or entry not found */
  1175. X}
  1176. X
  1177. X
  1178. X/*
  1179. X *  FUNCTION
  1180. X *    getenvname
  1181. X *
  1182. X *  DESCRIPTION
  1183. X *    Get the name of an environment variable.
  1184. X *
  1185. X *  NOTE
  1186. X *    This function MUST be called in Forbid()`ed state!
  1187. X */
  1188. X
  1189. Xstatic char *
  1190. Xgetenvname( register char * orgname )
  1191. X{
  1192. X    register char * p;
  1193. X    register int    len;
  1194. X    register char * newname;
  1195. X    register int    namelen;
  1196. X
  1197. X    if ( p = ((struct EnvBase*)ArpBase->EnvBase)->EnvSpace ) {
  1198. X
  1199. X    namelen = __builtin_strlen( orgname );
  1200. X
  1201. X    while (*p) {
  1202. X        len = __builtin_strlen(p);
  1203. X
  1204. X        if ( (Strncmp(p, orgname, namelen) == 0) &&
  1205. X            (p[namelen] == '=') ) {
  1206. X        newname = DosAllocMem (namelen+1);
  1207. X        __builtin_memcpy( newname, p, namelen );
  1208. X        return ( newname );
  1209. X        }
  1210. X        p += len + 1;
  1211. X    }
  1212. X    }
  1213. X    return (NULL);
  1214. X}
  1215. X
  1216. X
  1217. X/*
  1218. X *  FUNCTION
  1219. X *    ReAlloc
  1220. X *
  1221. X *  DESCRIPTION
  1222. X *    Alloctes a biger memory area and copies the contens of
  1223. X *    the original block. It then releases the original
  1224. X *    block.
  1225. X *
  1226. X *  RETURNS
  1227. X *    A pointer to the new memory block. Or a NULL is
  1228. X *    AllocMem failed, in which case the original
  1229. X *    memory block is NOT released.
  1230. X */
  1231. X
  1232. Xstatic void *
  1233. XReAlloc ( void * oldbuf, long oldsize, long newsize, long flags )
  1234. X{
  1235. X    void * newbuf;
  1236. X
  1237. X    if (newbuf = AllocMem(newsize, flags)) {
  1238. X
  1239. X    if ((oldbuf != NULL) && (oldsize != 0L)) {
  1240. X        __builtin_memcpy( newbuf, oldbuf, MAX(oldsize, newsize) );
  1241. X        FreeMem( oldbuf, oldsize );
  1242. X    }
  1243. X    }
  1244. X    return (newbuf);
  1245. X}
  1246. END_OF_FILE
  1247. if test 16462 -ne `wc -c <'funcs.c'`; then
  1248.     echo shar: \"'funcs.c'\" unpacked with wrong size!
  1249. fi
  1250. # end of 'funcs.c'
  1251. fi
  1252. if test -f 'funcs.h' -a "${1}" != "-c" ; then 
  1253.   echo shar: Will not clobber existing file \"'funcs.h'\"
  1254. else
  1255. echo shar: Extracting \"'funcs.h'\" \(2266 characters\)
  1256. sed "s/^X//" >'funcs.h' <<'END_OF_FILE'
  1257. X/*
  1258. X *  FILE
  1259. X *    funcs.h
  1260. X *
  1261. X *  DESCRIPTION
  1262. X *    This file is the headerfile for the funcs.c file.
  1263. X *    It contains includes, structure definitions, definitions
  1264. X *    and forward references.
  1265. X */
  1266. X
  1267. X    /* Headerfiles */
  1268. X#include <exec/types.h>
  1269. X#include <exec/nodes.h>
  1270. X#include <exec/ports.h>
  1271. X#include <exec/memory.h>
  1272. X#include <libraries/dos.h>
  1273. X#include <libraries/dosextens.h>
  1274. X
  1275. X#include <string.h>
  1276. X
  1277. X#define  ARP_PRIVATE
  1278. X#include <libraries/arpbase.h>
  1279. X
  1280. X#include <proto/exec.h>
  1281. X
  1282. X#include "globals.h"        /* All global definitions */
  1283. X
  1284. X/*
  1285. X *  STRUCTURE
  1286. X *    valuebuf
  1287. X *
  1288. X *  DESCRIPTION
  1289. X *    Store the value of the variable temporary.
  1290. X *
  1291. X *    When this strucure is used for reading, the vb_buf points
  1292. X *    to an internal buffer containing the value. The vb_pos
  1293. X *    is the read pointer and the vb_end is size of the buffer.
  1294. X *
  1295. X *    During writing, the vb_buf points to a writing buffer,
  1296. X *    vb_pos is the write pointer, and vb_end is the size of
  1297. X *    the write. If the buffer is to small ReAlloc is called.
  1298. X *    The filename is stored in vb_name.
  1299. X */
  1300. X
  1301. Xstruct valuebuf {
  1302. X    char * vb_buf;
  1303. X    long   vb_end;
  1304. X    long   vb_pos;
  1305. X    long   vb_flags;
  1306. X    char * vb_name;
  1307. X};
  1308. X
  1309. X
  1310. X/*
  1311. X *  STRUCTURE
  1312. X *    myFileLock
  1313. X *
  1314. X *  DESCRIPTION
  1315. X *    This is a standard `FileLock' structure, but with the fl_Key
  1316. X *    field changed to fl_Name.
  1317. X */
  1318. X
  1319. Xstruct myFileLock {
  1320. X    BPTR         fl_Link;
  1321. X    char       * fl_Name;        /* Used to be `LONG fl_Key' */
  1322. X    LONG         fl_Access;
  1323. X    struct MsgPort * fl_Task;
  1324. X    BPTR         fl_Volume;
  1325. X};
  1326. X
  1327. X
  1328. X/*
  1329. X *  DEFINTIONS
  1330. X */
  1331. X
  1332. X#define BTOC(x)        ((void *) ( ((LONG)(x)) << 2 ) )
  1333. X#define CTOB(x)        ((BPTR)   ( ((LONG)(x)) >> 2 ) )
  1334. X
  1335. X#define DOS_FALSE    (0)
  1336. X#define DOS_TRUE    (-1)
  1337. X
  1338. X#define NAMESIZE    (256)    /* Size of a buffer for storing names    */
  1339. X
  1340. X#define BUFSTEP        (128)    /* Additional allocation during writes    */
  1341. X
  1342. X#define FIRST_KEY    (1)
  1343. X
  1344. X    /* Flags to be stored in vb_flags */
  1345. X#define ENVB_READ    (0)                
  1346. X#define ENVB_WRITE    (1)
  1347. X
  1348. X#define ENVF_READ    (1<<ENVB_READ)
  1349. X#define ENVF_WRITE    (1<<ENVB_WRITE)
  1350. X
  1351. X#define MAX(x,y)    ((x)>(y)?(x):(y))
  1352. X
  1353. X    /* Forward References */
  1354. Xextern char        * mygetenv    (register char *);
  1355. Xextern char        * getnextenv    (register struct FileInfoBlock * fib,
  1356. X                     register struct DosPacket * pkt);
  1357. Xextern char        * getenvname    (register char *);
  1358. Xextern void        * ReAlloc    (void *, long, long, long);
  1359. X
  1360. END_OF_FILE
  1361. if test 2266 -ne `wc -c <'funcs.h'`; then
  1362.     echo shar: \"'funcs.h'\" unpacked with wrong size!
  1363. fi
  1364. # end of 'funcs.h'
  1365. fi
  1366. if test -f 'globals.h' -a "${1}" != "-c" ; then 
  1367.   echo shar: Will not clobber existing file \"'globals.h'\"
  1368. else
  1369. echo shar: Extracting \"'globals.h'\" \(1136 characters\)
  1370. sed "s/^X//" >'globals.h' <<'END_OF_FILE'
  1371. X/*
  1372. X *  FILE
  1373. X *    globals.h
  1374. X *
  1375. X *  DESCRIPTION
  1376. X *    This file conatins all the global defintions of the env-handler
  1377. X *    project. This file is read by env-handler.c (through env-handler.h)
  1378. X *    and funcs.c (through funcs.h)
  1379. X */
  1380. X
  1381. X    /* This is the only Global Variable. */
  1382. Xextern struct ArpBase    * ArpBase;
  1383. X
  1384. X
  1385. X    /* Global function references */
  1386. Xextern void action_input        (register struct DosPacket *,
  1387. X                          struct MsgPort   *);
  1388. Xextern void action_read            (register struct DosPacket *);
  1389. Xextern void action_output        (register struct DosPacket *,
  1390. X                          struct MsgPort   *);
  1391. Xextern void action_write        (register struct DosPacket *);
  1392. Xextern void action_end            (register struct DosPacket *);
  1393. Xextern void action_lock            (register struct DosPacket *,
  1394. X                          struct MsgPort   *,
  1395. X                          struct DosList   *);
  1396. Xextern void action_copy_lock        (register struct DosPacket *);
  1397. Xextern void action_freelock        (register struct DosPacket *);
  1398. Xextern void action_delete        (register struct DosPacket *);
  1399. Xextern void action_examine_object   (register struct DosPacket *);
  1400. Xextern void action_examine_next     (register struct DosPacket *);
  1401. END_OF_FILE
  1402. if test 1136 -ne `wc -c <'globals.h'`; then
  1403.     echo shar: \"'globals.h'\" unpacked with wrong size!
  1404. fi
  1405. # end of 'globals.h'
  1406. fi
  1407. if test -f 'makefile' -a "${1}" != "-c" ; then 
  1408.   echo shar: Will not clobber existing file \"'makefile'\"
  1409. else
  1410. echo shar: Extracting \"'makefile'\" \(1046 characters\)
  1411. sed "s/^X//" >'makefile' <<'END_OF_FILE'
  1412. X#
  1413. X#    Makefile for the env-handler file.
  1414. X#    Written by Anders Lindgren
  1415. X#
  1416. X
  1417. XCFLAGS = -v -b -cfsi # -d
  1418. X
  1419. XLNKFLG = BATCH VERBOSE NODEBUG
  1420. XLIB    =
  1421. XMAP    = MAP env.map HXSFL
  1422. X
  1423. X
  1424. Xenv-handler : env-handler.o funcs.o
  1425. X        blink TO env-handler FROM env-handler.o funcs.o $(LIB) $(LNKFLG) $(MAP)
  1426. X
  1427. Xfuncs.o     : funcs.c funcs.h
  1428. X        lc $(CFLAGS) funcs
  1429. X
  1430. Xenv-handler.o : env-handler.c env-handler.h
  1431. X        lc $(CFLAGS) env-handler
  1432. X
  1433. X
  1434. Xtest        : test.o
  1435. X        blink TO test FROM lib:arpc.o test.o LIB lib:arp.lib lib:lc.lib $(LNKFLG)
  1436. X
  1437. Xtest.o        : test.c
  1438. X        lc test
  1439. X
  1440. X
  1441. Xdie        : die.o
  1442. X        blink TO die FROM lib:arpc.o die.o LIB lib:arp.lib lib:lc.lib $(LNKFLG)
  1443. X
  1444. Xdie.o        : die.c
  1445. X        lc die
  1446. X
  1447. X#
  1448. X#    Backup all important files.
  1449. X#
  1450. X
  1451. Xbackup        :
  1452. X        lharc -a a backup3:env2manx.lzh env-handler env-handler.c env-handler.h funcs.c funcs.h globals.h env.doc die.c makefile mountlist test.c
  1453. X
  1454. X#
  1455. X#    Create the releasearchive.
  1456. X#
  1457. X
  1458. Xrelease        :
  1459. X        lharc -a u MyReleases:env2manx100.lzh env-handler env-handler.c env-handler.h funcs.c funcs.h globals.h env.doc makefile mountlist
  1460. END_OF_FILE
  1461. if test 1046 -ne `wc -c <'makefile'`; then
  1462.     echo shar: \"'makefile'\" unpacked with wrong size!
  1463. fi
  1464. # end of 'makefile'
  1465. fi
  1466. if test -f 'mountlist' -a "${1}" != "-c" ; then 
  1467.   echo shar: Will not clobber existing file \"'mountlist'\"
  1468. else
  1469. echo shar: Extracting \"'mountlist'\" \(171 characters\)
  1470. sed "s/^X//" >'mountlist' <<'END_OF_FILE'
  1471. X/* Mountlist entry for the env: device. Merge it in the devs:mountlist */
  1472. X
  1473. XENV:
  1474. X    Handler   = l:env-handler
  1475. X    stacksize = 4000
  1476. X    priority  = 5
  1477. X    GlobVec   = -1
  1478. X#
  1479. X
  1480. END_OF_FILE
  1481. if test 171 -ne `wc -c <'mountlist'`; then
  1482.     echo shar: \"'mountlist'\" unpacked with wrong size!
  1483. fi
  1484. # end of 'mountlist'
  1485. fi
  1486. echo shar: End of archive 1 \(of 1\).
  1487. cp /dev/null ark1isdone
  1488. MISSING=""
  1489. for I in 1 ; do
  1490.     if test ! -f ark${I}isdone ; then
  1491.     MISSING="${MISSING} ${I}"
  1492.     fi
  1493. done
  1494. if test "${MISSING}" = "" ; then
  1495.     echo You have the archive.
  1496.     rm -f ark[1-9]isdone
  1497. else
  1498.     echo You still need to unpack the following archives:
  1499.     echo "        " ${MISSING}
  1500. fi
  1501. ##  End of shell archive.
  1502. exit 0
  1503. -- 
  1504. Submissions to comp.sources.amiga and comp.binaries.amiga should be sent to:
  1505.     amiga@cs.odu.edu    
  1506. or    amiga@xanth.cs.odu.edu    ( obsolescent mailers may need this address )
  1507. or    ...!uunet!xanth!amiga    ( very obsolescent mailers need this address )
  1508.  
  1509. Comments, questions, and suggestions s should be addressed to ``amiga-request''
  1510. (only use ``amiga'' for submissions) at the above addresses.
  1511.